package com.swa99ylum.pjv.validator;

import java.util.HashMap;
import java.util.Map;

import com.swa99ylum.pjv.exception.JSONValidateException;
import com.swa99ylum.pjv.util.PJVUtils;
import com.swa99ylum.pjv.validator.KeyGenerator;
import com.swa99ylum.pjv.validator.Validator;

/**
 * 验证：多个 row 之间，主键值 的 唯一性
 *
 */
/** <h1>唯一性 验证器</h1>
<br> 1) 默认情况下，会将 value 作为 key，进行 唯一性 验证
<br> 2) 开发者 也可以 自定义 KeyGenerator，指定 key 的 生成逻辑，从而 可以 扩大/缩小 唯一性 的 区间范围
<br>    
 */
public class UniqueValidator extends Validator {
	
	/** 存储主键 */
	private Map<String, String> map = new HashMap<String, String>();
	
	private KeyGenerator keyGenerator;
	
	public UniqueValidator() {
		this(null);
	}
	public UniqueValidator(KeyGenerator keyGenerator) {
		super();
		this.keyGenerator = keyGenerator;
	}
	
	@Override
	public void doValidate(Object rootObject, String[] nodePath, String nodeName, Map<String, Object> parentValue, Object value) throws JSONValidateException {
		String k = keyGenerator == null? String.valueOf(value) : keyGenerator.generate(rootObject, nodePath, nodeName, parentValue, value);
		String v = map.get(k);
		
		String nodePathStr = PJVUtils.getNodePathStr(nodePath);
		
		if(v == null) {
			map.put(k, nodePathStr);
			
		} else {
			
			throw new JSONValidateException(nodePath, value, "存在 唯一键冲突：" + nodePathStr + " 和 " + v + " 存在冲突的 值: " + k);
		}
	}
	

	
//	@SuppressWarnings("unchecked")
//	@Override
//	public Msg doValidate(String json, Object value) {
//		
//		if(value instanceof List) {
//			List<Object> list = (List<Object>) value;
//			for (Object ele : list) {
//				if(ele != null) {//只为 非null 的值进行 判断，即 允许 null 重复。这个做法和 数据库中 唯一约束 的 做法是 一样的
//					if(map.get(ele) == null) {
//						map.put(String.valueOf(ele), String.valueOf(ele));
//					}else {
//						return new Msg("主键冲突");
//					}
//				} 
//			}
//		}else {
//			
//		}
//		
//		return null;
//	}

	

//	private void aaa(Object ele) {
//		if(map.get(ele) != null) return new Msg("主键冲突");
//	}
	

}
